// 观察者的目的就是给需要变化的那个元素增加一个观察这， 当数据变化后执行对应的方法
class Watchwer{
    constructor(vm,expr,cb){
      this.vm=vm;
      this.expr=expr;
      this.cb=cb;
      // 先获取老的值
      this.value = this.get();
    }
    getVal(vm,expr){
        expr= expr.split('.');
        //获取实例上对应的数据
        return expr.reduce((perv,next,index)=>{ // vm.$data.a
            return perv[next]
        },vm.$data);
    }

    get(){
        Dep.target = this;
        let value=  this.getVal(this.vm,this.expr)
        Dep.target=null
        return value
    }
    // 对外暴露的方法
    update(){
        let newValue = this.getVal(this.vm,this.expr);
        let oldValue =this.value
        if(newValue != oldValue){
            this.cb(newValue);// 调用 Watchwer 的callback
        }
    }
}

// 用新值和老值 进行对比 如果发生变化 就调用 更新方法